﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Demo4
{
    internal class Program
    {
        /// <summary>
        /// 位运算
        /// 通常用于电子签名、通信协议、加密解密
        /// http://www.lzzy.edu.cn/  无签名验证的网站
        /// https://www.alipay.com/  带认证签名的，能够证明这个网站不是伪造的
        /// SHA-512  MD5 签名算法
        /// </summary>
        /// <param name="args"></param>
        static void Main(string[] args)
        {
            // 按位与运算&
            var num1 = 5;
            var num2 = 13;

            // num1 转换成2进制  0101
            // num2 转换成2进制  1101
            // 按位进行与运算 得   0101
            // 按十进制输出结果    5
            Console.WriteLine("num1({0})&num2({1})的结果是：{2}", num1, num2, num1 & num2);

            // num1 转换成2进制  0101
            // num2 转换成2进制  1101
            // 按位进行或运算 得   1101
            // 按十进制输出结果    13 
            Console.WriteLine("num1({0})|num2({1})的结果是：{2}", num1, num2, num1 | num2);


            // num1 转换成2进制     0101
            // num2 转换成2进制     1101
            // 按位进行异或运算 得   1000  
            // 按十进制输出结果       8   
            Console.WriteLine("num1({0})^num2({1})的结果是：{2}", num1, num2, num1 ^ num2);

            // num1 转换成2进制     0101
            // 按位取反运算 得          1010              
            Console.WriteLine("~num1的结果是：{0}", ~num1);

            // num1 转换成2进制     0101
            // 左移二位                   10100
            //右移二位                      0001 
            Console.WriteLine("num1<<2的结果是：{0}", num1<<2);
            Console.WriteLine("num1>>2的结果是：{0}", num1 >> 2);

            num1 <<= 2;
            Console.WriteLine("移位赋值后，num1结果是：{0}", num1);

            // 二进制 ： 原码、反码和补码  ,  计算机中的二进制都是用补码来表示
            // 补码可以表示负数-> 可以把减法变成加法算
            // 正数的补码 就是 原码    十进制3     原0011     补0011
            // 负数的补码 1.最高位是符号位,负数的符号位1， 正数的符号位为0;
            // 负数的原码转补码方法:   2. 符号位不变，其余位取反；  3.+1    就得到补码。

            num1 = 0;

            //   0000
            //   1111  按位取后得到的结果
            //   1000+1  -> 补码1001
            //   ~a  == -(a+1)
            Console.WriteLine("num1:{0}取反结果是：{1}", num1, ~num1);

            num1 = 5; 
            Console.WriteLine("num1:{0}取反结果是：{1}", num1, ~num1);

            Console.ReadKey();
        }
    }
}
